package com.lzh.others.basejava.Reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 利用反射操作对象
 */
public class Main_04 {

    public static void main(String[] args) throws Exception {
        Class<?> aClass1 = Class.forName("com.lzh.others.basejava.Reflection.User");
        Constructor<?> constructor = aClass1.getDeclaredConstructor();
        Constructor<?> constructor1 = aClass1.getDeclaredConstructor(String.class, int.class);
        Object ob = constructor1.newInstance("lzh", 25);
        //建议使用反射直接调用和操作对象的方法和字段
        //因为如果在编写阶段已经明确了要转换的类型，那么直接显示的调用更加合适，而不必依赖于反射
//        if (ob instanceof User) {
//            User user = (User) ob;
//        }
//        aClass1.cast(ob);
        //其真正价值在于处理编译时未知的类型，从而编写更具有通用性的代码
        Field field = aClass1.getDeclaredField("age");
        field.setAccessible(true);
        field.set(ob, 30);//通过反射，我们可以修改私有属性和final修饰的字段
        //这其实破坏了java的封装性和设计原则
        System.out.println("name = " + field.get(ob));

        Method method = aClass1.getDeclaredMethod("myPublicMethod");
        method.invoke(ob);
    }
}
